#include "HashIdentificadores.h"

HashIdentificadores::HashIdentificadores()
{
	this->mHash = new vector<NoHash*>[67]; //se utilizar o do AHO eh 211
}

bool HashIdentificadores::Add(NoHash * mInserir)
{
	//insere na posicao calcula pela funcaoHash
	
	this->mHash[FuncaoHash(mInserir)].push_back(mInserir); // problema!!.. onde esta a variavel original??
	return true;
}

int HashIdentificadores::FuncaoHash(NoHash*  mCalcula)
{
	// fazer funcao hash
	// funcao hash baseada na funcao definida pela professora
	
	string palavra;
	palavra = mCalcula->GetId();
	unsigned int h = 0;
	for(unsigned int cont = 0; cont < palavra.size(); cont++)
		h = h + 3 * (int)palavra[cont];
	return h % 7;

	//return 2; // apenas para testar!!!
}
/**
 * Pesquisa por uma palavra na hash
 */
bool HashIdentificadores::Pesquisa(NoHash* pesquisar)
{
	int indice = this->FuncaoHash(pesquisar);
	for(unsigned int cont = 0; cont < this->mHash[indice].size(); cont++)
	{
		if(this->mHash[indice][cont]->GetId() == pesquisar->GetId())
		{
			cout<<"A Palavra "<<pesquisar->GetId() <<"foi encontrada na posicao ["<<indice<<"]["<<cont<<"]"<<endl;
			return true;
		}
	}
	return false;
}
/**
 * Pesquisa por um identificador na hash no nivel lexico especificado na variavel pesquisar
 */
bool HashIdentificadores::PesquisaVariavelNivel(NoHash* pesquisar)
{
	int indice = this->FuncaoHash(pesquisar);
	for(unsigned int cont = 0; cont < this->mHash[indice].size(); cont++)
	{
		if(this->mHash[indice][cont]->GetId() == pesquisar->GetId() && this->mHash[indice][cont]->GetNivel() == pesquisar->GetNivel())
		{
			cout<<"A Palavra "<<pesquisar->GetId() <<"foi encontrada na posicao ["<<indice<<"]["<<cont<<"]"<<endl;
			return true;
		}
	}
	return false;
}

bool HashIdentificadores::mostra()
{
	NoHash *mostra = mHash[2].back();
	mostra->R();
	return true;
}


HashIdentificadores::~HashIdentificadores()
{
	
	
}



